package p40_spring与tomcat;

import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Tomcat;
import org.apache.coyote.http11.Http11Nio2Protocol;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Collections;

/**
 * springboot使用了内嵌的tomcat
 * tomcat组成:
 * Server
 * --Service
 * --Connector(协议，端口)
 * --Engine
 * --Host(虚拟主机localhost)
 * --Context1(应用1，可以设置虚拟路径，与磁盘具体路径docBase对应)
 * --静态文件(index.html)
 * --WEB-INF
 * --web.xml
 * --classes(servlet,controller,service...)
 * --jsp
 * --lib
 * --Context2
 * 在新版本，web.xml可以使用编程方式，来指定servlet,filter,listener
 * 下面演示使用编程式，来创建Tomcat并运行
 */
public class _1_Tomcat {
    public static void main(String[] args) throws IOException, LifecycleException {
        Tomcat tomcat = new Tomcat();
        //tomcat基础路径，这里用的相对路径
        tomcat.setBaseDir("tomcat");
        //创建项目文件夹，docBase，这里用临时文件夹
        File docBase = Files.createTempDirectory("boot.").toFile();
        //程序退出时就删除文件夹
        docBase.deleteOnExit();

        //创建Tomcat项目，一个项目就是一个Context。设置虚拟路径与具体文件夹的对应关系
        Context context = tomcat.addContext("", docBase.getAbsolutePath());

        //添加servlet
        context.addServletContainerInitializer((set, ctx) -> {
            //这个初始化器在tomcat启动后回调
            //添加servlet，设置映射
            ctx.addServlet("hello", new HelloServlet())
                    .addMapping("/hello");
        }, Collections.emptySet());

        //启动Tomcat
        tomcat.start();
        //创建连接器，设置协议，与监听端口
        Connector connector = new Connector(new Http11Nio2Protocol());
        connector.setPort(8080);
        //将tomcat与连接器关联
        tomcat.setConnector(connector);
    }

    static class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().println("<h1>hello world</>");
        }
    }
}
